package main

import (
	"syscall"
	"unsafe"
)

func BytePtr(str string) uintptr {
	s, e := syscall.UTF16FromString(str)
	if e != nil {
		println(e.Error())
	}
	return uintptr(unsafe.Pointer(&s[0]))
}
func StringToChar(str string) [64]uint16 {
	data, err := syscall.UTF16FromString(str)
	if err != nil {
		println(err.Error())
	}
	v := [64]uint16{}
	for i, datum := range data {
		v[i] = datum
	}
	return v
}
func StringToChar16(str string) [16]uint16 {
	data, err := syscall.UTF16FromString(str)
	if err != nil {
		println(err.Error())
	}
	v := [16]uint16{}
	for i, datum := range data {
		v[i] = datum
	}
	return v
}

//结构体成员 类型 说明
//LEDType int
//0.6 代 T 系 A 系 XC 系 W 系 1.6 代 E 系 2.X1X2 3.C 系

//SendType int
//通讯方式 0.为 Tcp 发送（又称固定 IP 通讯）,
//1.广播发送（又称单机直连）
//2.串口通讯 (SO 库不支持)
//3.磁盘保存 (SO 库不支持)
//4.广义网通讯（C2M\C4M 才支持）

// IpStr char
// LED 屏的 IP 地址，只有通讯方式为 0 时才需赋值，其它通讯方式无
// 需赋值
// Commport int
// 串口号，只有通讯方式为 2 时才需赋值，其它通讯方式无需赋值
// Baud int 波特率，只有通讯方式为 2 时才需赋值，其它通讯方式无需赋值,
// 0.9600 1.57600 2.115200 直接赋值 9600， 19200，
// 38400，57600，115200 亦可
// LedNumber int LED 的屏号，只有通讯方式为 2 时，且用 485 通讯时才需赋值，其
// 它通讯方式无需赋值
// OutputDir char 磁盘保存的目录，只有通讯方式为 3 时才需赋值，其它通讯方式无
// 需赋值
type COMMUNICATIONINF struct {
	LEDType  int32
	SendType int32
	//Commport  int32
	//Baud      int32
	//LedNumber int32
	IpStr [16]uint16
	//OutputDir uintptr
	//Commport  int32
	//Baud      int32
	//LedNumber int32
	//IpStr uintptr
	//IpStr []uint16
	//IpStr [256]int32
	//OutputDir string
}

func NewComInfo(ipStr string) *COMMUNICATIONINF {
	data, err := syscall.UTF16FromString(ipStr)
	if err != nil {
		println(err.Error())
	}
	ipV := [16]uint16{}
	for i, datum := range data {
		ipV[i] = datum
	}
	return &COMMUNICATIONINF{
		LEDType:  0,
		SendType: 0,
		IpStr:    ipV,
	}
}

func NewComInfoUintPtr(ipStr string) uintptr {
	return uintptr(unsafe.Pointer(NewComInfo(ipStr)))
}

// AREARECT（区域坐标结构体）
// 结构体成员 类型 说明
// left int 区域左上角横坐标
// top int 区域左上角纵坐标
// width int 区域的宽度
// height int 区域的高度
type AREARECT struct {
	Left   int32
	Top    int32
	Width  int32
	Height int32
}

// FONTPROP（字体属性结构体）
// 结构体成员 类型 说明
// FontName char DLL 库为字体名，SO 库为字库文件的路径（如/home/simsun.ttc）
// FontSize int 字号(DLL库单位磅，SO 库单位像素)
// FontColor unsigned long 字体颜色 格式为 BBGGRR（如：红色 0xff 绿色 0xff00 黄色 0xffff）
// FontBold bool 是否加粗
// FontItalic bool 是否斜体
// FontUnderLine bool 是否下划线
type FONTPROP struct {
	FontName      [32]uint16
	FontSize      int32
	FontColor     uint32
	FontBold      int32
	FontItalic    int32
	FontUnderLine int32
}

// DIGITALCLOCKAREAINFO（数字时钟属性结构体）
// 结构体成员 类型 说明
// ShowStr char 自定义显示字符串
// ShowStrFont FONTPROP 自定义显示字符串以及日期星期时间的字体属性，注意此字体属性
// 里的 FontColor 只对自定义显示字体有效，其它项的颜色有单独的颜
// 色属性，属性的赋值见 FONTPROP 结构体说明
// TimeLagType int 时差类型 0 为超前，1 为滞后
// HourNum int 时差小时数
// MiniteNum int 时差分钟数
// DateFormat int 日期格式 0. YYYY 年 MM 月 DD 日
// 1. YY 年 MM 月 DD 日
// 2. MM/DD/YYYY
// 3. YYYY/MM/DD
// 4. YYYY-MM-DD
// 5. YYYY.MM.DD
// 6. MM.DD.YYYY
// 7. DD.MM.YYYY
// DateColor unsigned long 日期字体颜色 格式为 BBGGRR（如：红色 0xff 绿色 0xff00 黄色
// 0xffff）
// WeekFormat int 星期格式 0.星期 X 1.Monday 2.Mon.
// WeekColor unsigned long 星期字体颜色
// TimeFormat int 时间格式 0. HH 时 mm 分 ss 秒
// 1. HH 時 mm 分 ss 秒
// 2. HH:mm:ss
// 3. 上午 HH:mm:ss
// 4. AM HH:mm:ss
// 5. HH:mm:ss 上午
// 6. HH:mm:ss AM
// TimeColor unsigned long 时间字体颜色
// IsShowYear bool 是否显示年 TRUE 为显示 FALSE 不显示 下同
// IsShowWeek bool 是否显示星期
// IsShowMonth bool 是否显示月
// IsShowDay bool 是否显示日
// IsShowHour bool 是否显示时
// IsShowMinute bool 是否显示分
// IsShowSecond bool 是否显示秒
// IsMutleLineShow bool 是否多行显示
type DIGITALCLOCKAREAINFO struct {
	ShowStr         string
	ShowStrFont     FONTPROP
	TimeLagType     int32
	HourNum         int32
	MiniteNum       int32
	DateFormat      int32
	DateColor       int32
	WeekFormat      int32
	WeekColor       int32
	TimeFormat      int32
	TimeColor       int32
	IsShowYear      bool
	IsShowWeek      bool
	IsShowMonth     bool
	IsShowDay       bool
	IsShowHour      bool
	IsShowMinute    bool
	IsShowSecond    bool
	IsMutleLineShow bool
}

// 4.4. PLAYPROP（页面显示的属性结构体）
// 结构体成员									类型					说明
// InStyle									char					"入场特技值（取值范围 0-38）
// 0=立即显示
// 1=随机
// 2=左移
// 3=右移
// 4=上移
// 5=下移
// 6=连续左移
// 7=连续右移
// 8=连续上移
// 9=连续下移
// 10=闪烁
// 11=激光字(向上)
// 12=激光字(向下)
// 13=激光字(向左)
// 14=激光字(向右)
// 15=水平交叉拉幕
// 16=上下交叉拉幕
// 17=左右切入"
// "    18=上下切入
// 19=左覆盖
// 20=右覆盖
// 21=上覆盖
// 22=下覆盖
// 23=水平百叶(左右)
// 24=水平百叶(右左)
// 25=垂直百叶(上下)
// 26=垂直百叶(下上)
// 27=左右对开
// 28=上下对开
// 29=左右闭合
// 30=上下闭合
// 31=向左拉伸
// 32=向右拉伸
// 33=向上拉伸
// 34=向下拉伸
// 35=分散向左拉伸
// 36=分散向右拉伸
// 37=冒泡
// 38=下雪"
// OutStyle				int			退场特技值（现无效，预留，置 0）
// Speed			unsigned long		特技显示速度(取值范围 1-255) 数值越大速度越慢
// DelayTime			bool		"页面留停时间(1-65535)       注： 当入场特技为连续左移、连续右
// 移、连续上移、连续下移时，此参数无效"
type PLAYPROP struct {
	InStyle   int32
	OutStyle  int32
	Speed     int32
	DelayTime int32
}
